package com.spark.WorCount

import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ArrayBuffer

object MapPartitionByScala {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setAppName("MapPartitionByScala")
      .setMaster("local")
    val sparkContext = new SparkContext(conf)
    val rdd=sparkContext.parallelize(Array(1,2,3,4,5,6),2)
//    val newRdd=rdd.map(num=>{
//      println("map算子")
//      num*2
//    })
    val Sum=rdd.mapPartitions(number=>{
      println("==================")
      //在这里一般用来进行初始化和数据库链接等这些操作
      // （数据库链接对象不能被序列化因此不能从Driver端传递到Task任务中，所以数据库链接放在算子中进行）
      //通过mapPartition算子可以减少map算子创建的数据库链接对象
      val result = new ArrayBuffer[Int]()
      //这个foreach是调用的scala里面的函数
      number.foreach(num=>{
        result+=(num*2)
      })
      //关闭数据库链接
      result.iterator
    }).reduce(_ + _)
    println(Sum)
  }


}
